/**
 * @file iec104_protocol_bridge.h
 * @brief IEC 104协议桥接模块接口
 * @details 实现MQTT协议与IEC 60870-5-104协议之间的双向转换和通信
 * 
 * @author zyb
 * @date 2025-10-30
 * @version 1.0
 */

#ifndef IEC104_PROTOCOL_BRIDGE_H
#define IEC104_PROTOCOL_BRIDGE_H

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include "../../../../app/common/mqtt/include/mqtt_client.h"

#ifdef __cplusplus
extern "C" {
#endif

/* ==================== 数据结构定义 ==================== */

/**
 * @brief IEC 104协议桥接配置
 */
typedef struct {
    /* 104设备配置 */
    char device_ip[64];                 /* 设备IP地址 */
    uint16_t device_port;               /* 设备端口 */
    
    /* MQTT客户端 */
    mqtt_client_handle_t mqtt_client;   /* MQTT客户端句柄 */
    
    /* MQTT主题 */
    char mqtt_topic_data[256];          /* 数据上报主题 */
    char mqtt_topic_status[256];        /* 状态上报主题 */
    char mqtt_topic_alarm[256];         /* 告警上报主题 */
    
    /* 数据上报周期 */
    uint32_t data_report_interval;      /* 数据上报周期(秒) */
    
} iec104_protocol_bridge_config_t;

/**
 * @brief IEC 104协议桥接统计信息
 */
typedef struct {
    uint64_t mqtt_to_iec104_count;      /* MQTT到IEC104消息数 */
    uint64_t iec104_to_mqtt_count;      /* IEC104到MQTT消息数 */
    uint64_t conversion_errors;         /* 转换错误数 */
    uint64_t send_errors;               /* 发送错误数 */
} iec104_protocol_bridge_stats_t;

/**
 * @brief IEC 104协议桥接句柄
 */
typedef struct iec104_protocol_bridge* iec104_protocol_bridge_handle_t;

/* ==================== 函数声明 ==================== */

/**
 * @brief 创建IEC 104协议桥接
 * @details 创建MQTT与IEC 104协议桥接实例
 * 
 * @param config 桥接配置参数
 * @return 桥接句柄，失败返回NULL
 */
iec104_protocol_bridge_handle_t iec104_protocol_bridge_create(const iec104_protocol_bridge_config_t* config);

/**
 * @brief 销毁IEC 104协议桥接
 * @details 销毁桥接实例，释放资源
 * 
 * @param bridge 桥接句柄
 * @return 0表示成功，-1表示失败
 */
int iec104_protocol_bridge_destroy(iec104_protocol_bridge_handle_t bridge);

/**
 * @brief 启动IEC 104协议桥接
 * @details 启动桥接服务，开始数据转换和传输
 * 
 * @param bridge 桥接句柄
 * @return 0表示成功，-1表示失败
 */
int iec104_protocol_bridge_start(iec104_protocol_bridge_handle_t bridge);

/**
 * @brief 停止IEC 104协议桥接
 * @details 停止桥接服务
 * 
 * @param bridge 桥接句柄
 * @return 0表示成功，-1表示失败
 */
int iec104_protocol_bridge_stop(iec104_protocol_bridge_handle_t bridge);

/**
 * @brief 处理MQTT消息
 * @details 将MQTT消息转换为IEC 104协议并发送给设备
 * 
 * @param bridge 桥接句柄
 * @param topic MQTT主题
 * @param payload 消息内容
 * @param payload_len 消息长度
 * @return 0表示成功，-1表示失败
 */
int iec104_protocol_bridge_handle_mqtt_message(iec104_protocol_bridge_handle_t bridge,
                                                const char* topic,
                                                const uint8_t* payload,
                                                size_t payload_len);

/**
 * @brief 上报IEC 104设备数据到MQTT
 * @details 将IEC 104设备数据转换为MQTT消息并发布到平台
 * 
 * @param bridge 桥接句柄
 * @param data_type 数据类型（遥测、遥信等）
 * @param data 数据内容
 * @param data_len 数据长度
 * @return 0表示成功，-1表示失败
 */
int iec104_protocol_bridge_report_device_data(iec104_protocol_bridge_handle_t bridge,
                                               const char* data_type,
                                               const uint8_t* data,
                                               size_t data_len);

/**
 * @brief 获取IEC 104桥接统计信息
 * @details 获取协议桥接的统计信息
 * 
 * @param bridge 桥接句柄
 * @param stats 统计信息输出
 * @return 0表示成功，-1表示失败
 */
int iec104_protocol_bridge_get_stats(iec104_protocol_bridge_handle_t bridge,
                                      iec104_protocol_bridge_stats_t* stats);

/**
 * @brief 重置IEC 104桥接统计信息
 * @details 重置协议桥接的统计信息
 * 
 * @param bridge 桥接句柄
 * @return 0表示成功，-1表示失败
 */
int iec104_protocol_bridge_reset_stats(iec104_protocol_bridge_handle_t bridge);

/**
 * @brief 发送104协议控制命令
 * @details 向104设备发送单点控制命令（遥控指令）
 * 
 * @param bridge 桥接句柄
 * @param point_number 信息点号（信息对象地址）
 * @param value 控制值（true=合/开，false=分/关）
 * @return 0表示成功，-1表示失败
 */
int iec104_protocol_bridge_send_command(iec104_protocol_bridge_handle_t bridge,
                                         uint32_t point_number,
                                         bool value);

/**
 * @brief 检查104设备连接状态
 * @details 检查104设备是否已连接
 * 
 * @param bridge 桥接句柄
 * @return true表示已连接，false表示未连接
 */
bool iec104_protocol_bridge_is_connected(iec104_protocol_bridge_handle_t bridge);

#ifdef __cplusplus
}
#endif

#endif /* IEC104_PROTOCOL_BRIDGE_H */

